/*
 * @Date         : 2024-05-21 20:32:20 星期2
 * @Author       : xut
 * @Description  :
 */
import { NestFactory } from '@nestjs/core';
import { MicroserviceOptions } from '@nestjs/microservices';
import { AppModule } from './app.module';
import { Transport } from '@nestjs/microservices';
import { join } from 'path';
import { ServerInterceptingCall } from '@grpc/grpc-js';

async function bootstrap() {
  /**
   * 如果独立作为微服务使用时，参照如下开启服务
   */
  // const app = await NestFactory.createMicroservice<MicroserviceOptions>(
  //   AppModule,
  //   {
  //     transport: Transport.GRPC,
  //     options: {
  //       package: 'hero',
  //       protoPath: join(__dirname, 'hero/hero.proto'),
  //     },
  //   },
  // );
  // await app.listen();

  /**
   * 当前例子混合了grpc 服务端和客户调用，客户端通过 HTTP + gRPC 实现
   * 所以当前服务启动代码如下：
   */
  const app = await NestFactory.create(AppModule);

  app.connectMicroservice<MicroserviceOptions>({
    transport: Transport.GRPC,
    options: {
      package: ['hero', 'hello'], // 可以是字符串 hero，也可以是数组多外包 ['hero', 'hero2']
      protoPath: [
        join(__dirname, './hero/hero.proto'),
        join(__dirname, './hello/hello.proto'),
      ], // 可以是字符串形式单个 './hero/hero.proto，也可以是数组形式多个 ['./hero/hero.proto', './hero/hero2.proto']
      channelOptions: {
        interceptors: [
          (methodDescriptor, nextCall) => {
            console.log('CALLED SERVER INTERCEPTOR');
            return new ServerInterceptingCall(nextCall);
          },
        ],
      },
    },
  });

  await app.startAllMicroservices();
  await app.listen(3001);
}
bootstrap();
